% !Mode:: "TeX:UTF-8"

\chapter{JDBC项目}

\section{项目需求}

使用javaSE+JDBC+MySql技术开发基于控制台的“饿了么商家后台管理系统”。
\subsection{管理员端}
实现管理员业务流进行商家管理。实现管理员登录，管理员查询商家列表，按条件搜索、新建、删除商家。

\subsection{商家端}
实现商家业务流进行商家信息管理。实现商家登录，商家查看、修改商家信息、修改商家密码。商家进行所属食品管理，查询本商家的食品列表、更新食品信息、增添和修改食品。

\section{项目设计}

\subsection{数据库设计}

创建三个表：商家表、食品表、管理员表。

其中商家表中的主键~businessId~在食品表中作为外键，实现两个表之间的关联。商家表与食品表为一对多关系。

\subsubsection{Business（商家表）}

\begin{figure}[htbp]
\centering
\includegraphics[width=1.0\textwidth]{business.png}
\caption{business表}\label{fig:business}
\vspace{\baselineskip}
\end{figure}

\subsubsection{food（食品表）}
\begin{figure}[htbp]
  \centering
  \includegraphics[width=1.0\textwidth]{food.png}
  \caption{food表}\label{fig:business.png}
  \vspace{\baselineskip}
  \end{figure}
\subsubsection{admin（管理员表）}
\begin{figure}[htbp]
  \centering
  \includegraphics[width=1.0\textwidth]{admin.png}
  \caption{admin表}\label{fig:admin}
  \vspace{\baselineskip}
  \end{figure}

\subsection{总体开发框架}
分为四层：po层、util层、dao层、view层、商家和管理员程序入口。

开发框架如图~\ref{fig:structure.png}~所示
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.4\textwidth]{structure.png}
  \caption{开发框架}\label{fig:structure.png}
  \vspace{\baselineskip}
  \end{figure}

\subsubsection{po层}
持久对象层，存放实体类，类中定义了多个类属性，并与数据库表的字段保持一致，一张表对应一个po类。
\subsubsection{util层}
封装~JDBC~工具类。其中~jdbc.properties~为属性配置文件，里面存放着连接~SqlServer~的一系列资源参数。
\subsubsection{dao层}
数据持久层，对数据库进行访问与操作
     dao层中分为两部分：接口和实现类
\subsubsection{view层}
视图层，调用dao层接口，获取数据并接收用户输入与用户进行交互
     view层中分为两部分：接口和实现类
\subsubsection{管理员和商家程序入口}
展示商家和管理员图形界面，ElmBusinessEntry类和ElmAdminEntry类分别为商家业务流和管理员业务流程序的入口，接受部分控制台输入与用户进行交互。

\section{项目测试}

由于此项目是基于控制台的C/S结构应用程序，所以测试只需通过控制台输入即可。测试过程相对简单。

在完成管理员程序入口后进行了项目启动测试，发现了数据库连接异常。可是jar包导入，驱动路径填写均没有问题，通过上网查询后，是本地数据库权限问题，通过填写特定指令开放了数据库的所有访问把权限，bug解决。

在每编写完一个功能后，都会启动控制台以确保每一步都没有问题，防止遗留的错误。大多数的bug都是拼写错误，有的是数据库语句拼写错误，有时类名方法名大小写错误，但没有什么大的bug。测试过程相对顺利。

全部完成后最后进行集成测试，项目要求的功能全部实现，没有出现bug。

部分测试结果如图~\ref{fig:result1.png}~和~\ref{fig:result2.png}~所示
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.6\textwidth]{result1.png}
  \caption{部分测试结果}\label{fig:result1.png}
  \vspace{\baselineskip}
  \end{figure}

  \begin{figure}[htbp]
    \centering
    \includegraphics[width=0.6\textwidth]{result2.png}
    \caption{部分测试结果}\label{fig:result2.png}
    \vspace{\baselineskip}
    \end{figure}
\section{项目部署}

\subsection{项目所需技术}
JDK 1.8 

JDBC 

MySQL 数据库

\subsection{开发工具}
STS（spring-tool-suite）

mysql-8.0-winx64 

\subsection{实施流程}
1. 安装 jdk、STS、MySql。

2. 创建数据库

3. 在 STS 中创建 javaSE 项目。

4. 导入数据库连接jar包

5. 创建dao层、view层、po层、util层组件

6. 本项目有两个入口：管理员入口、商家入口。

  i. 运行 ElmAdminEntry 中的 main 函数为管理员入口。

  ii. 运行 ElmBusinessEntry 中的 main 函数为商家入口。

\section{开发过程记录}
\subsection{8月16日-8月20日}
(1) 学习JDBC相关知识。阅读项目文档，熟悉技术架构与功能需求。

(2) 设计数据库，完成数据库中表格的创建与部分样例数据导入。数据库创建过程截图如图~\ref{fig:1.png}~所示
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.5\textwidth]{1.png}
  \caption{数据库创建过程截图}\label{fig:1.png}
  \vspace{\baselineskip}
  \end{figure}
  
  (3) 搭建项目环境。确定项目架构，了解学习项目各层的功能，如dao层、po层等。完成各层的创建。
  
  (4) 编写ElmAdminEntry类（管理员入口），编写po层，建立实体类。封装JDBC工具类。
 
  (5) 实现管理员登录功能，涉及到AdminDao、AdminDaoImpl、AdminView、AdminViewImpl、ElmAdminEntry几个文件代码的编写，并上传gitee。
  \begin{figure}[htbp]
    \centering
    \includegraphics[width=0.5\textwidth]{2.png}
    \caption{gitee提交记录}\label{fig:2.png}
    \vspace{\baselineskip}
    \end{figure}

\subsection{8月21日}
实现管理员业务流中的查询所有商家列表、搜索商家、新建商家、删除商家四个功能，即完成了管理员业务流。涉及到BusinessDao、BusinessDaoImpl、BusinessView、BusinessViewImpl、ElmAdminEntry几个文件代码的编写，并上传gitee。
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.5\textwidth]{3.png}
  \caption{gitee提交记录}\label{fig:3.png}
  \vspace{\baselineskip}
  \end{figure}

\subsection{8月22日-8月23日}
创建编写ElmBusinessEntry类（管理员入口）,实现了商家业务流的商家登录功能和一级菜单中的查看和更新商家信息功能。涉及到BusinessDao、BusinessDaoImpl、BusinessView、BusinessViewImpl、ElmAdminEntry几个文件代码的编写，并上传gitee。
\begin{figure}[htbp]
    \centering
    \includegraphics[width=0.5\textwidth]{4.png}
    \caption{gitee提交记录}\label{fig:4.png}
    \vspace{\baselineskip}
    \end{figure}

\subsection{8月24日}
实现了商家业务流中的商家修改密码功能。涉及到BusinessDao、BusinessDaoImpl、BusinessView、BusinessViewImpl、ElmAdminEntry几个文件代码的编写，并上传gitee。
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.3\textwidth]{5.png}
  \caption{gitee提交记录}\label{fig:5.png}
  \vspace{\baselineskip}
  \end{figure}

\subsection{8月25日-8月27日}
实现了商家业务流的二级菜单中中商家对食品的增删改查功能，完成了商家业务流的所有功能，进行最后的集成测试，到此完成项目一，并上传gitee。
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.3\textwidth]{6.png}
  \caption{gitee提交记录}\label{fig:6.png}
  \vspace{\baselineskip}
  \end{figure}

\subsection{9月24日}
对项目一进行复盘，发现在DBUtil即封装JDBC工具类中的数据库连接参数应该单独放在一个配置文件中以降低耦合性，
创建了一个 jdbc.properties 属性配置文件，将数据库连接参数写入此文件。
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.4\textwidth]{7.png}
  \caption{gitee提交记录}\label{fig:7.png}
  \vspace{\baselineskip}
  \end{figure}

\section{项目特色}
\subsection{分层架构开发}
JDBC分层架构开发，将应用划分为若干层，每一层解决问题的一部分，通过各层的协作提供整体解决方案。
大的问题被分解为一系列相对独立的子问题，局部化在每一层中，这样就有效的降低了单个问题的规模和复杂度，实现了复杂系统的第一步也是最为关键的一步分解；

分层结构具有良好的可扩展性，且易于维护。在对系统进行分解后，不同的功能被封装在不同的层中，
层与层之间的耦合显著降低。因此在修改某个层的代码时，只要不涉及层与层之间的接口，就不会对其他层造成严重影响，充分体现高内聚，低耦合 的思想
\subsection{使用属性配置文件}
创建了一个~jdbc.properties~属性配置文件，里面存放着连接~SqlServer~的一系列资源参数。在编写JDBC工具类时会用到这些属性值来进行数据库连接。当更换数据库连接时，后期只需修改jdbc.properties，不会干扰到DBUtil中的代码，实现程序的低耦合性。

\section{项目所遇到的问题和解决方法}

1. 在项目构建时，因为是第一次做系统性的java开发，我对jdbc以及项目各层（po、dao、view、util）的功能不了解，项目难以进行，我去网上系统的学习了jdbc原理和各层的功能，使得能更顺利的完成项目。

2. 在第一次启动项目时，发现数据库连接异常，去网上查询了bug，发现在写参数时写错了数据库密码，进行了改正。但是还是有异常出现，最后查到时本地数据库权限问题，使用相关语句修改了数据库权限，使得可以远程访问，问题解决。

\section{总结与反思}
1. 在上学期学习了数据库之后，只是对数据库有了一个基础的认识，只是知道其相关的知识，停留在mysql中编写相关操作语句，并不知道数据库在实际软件开发中怎样应用。通过此次JDBC项目，使我掌握了怎样通过JAVA语言连接访问数据库，对数据库的应用有了更宏观且深入的认识。

2. 在完成一个项目时，除了相关技术的掌握，更重要的是严谨性，思维严谨，写代码的时候更要严谨，有时候因为一个单词的拼写错误产生的bug可能要找好久且浪费了很多时间，我个人觉得这是最低级的错误，但也是最常犯的，希望可以尽量避免。

3. 在DBUtil层中，课程资料中对JDBC工具的封装只有获取Connection对象和关闭资源两个方法。然而在每一个Dao层编写中，JDBC操作流程中的获取PreparedStatement对象、进行增删改操作等代码冗余性依然较高，仍可封装起来调用。所以在DBUtil工具类中可增加了对这两个方法的封装，减少冗余性，提高程序的可扩展性。
由于此次项目的dao层操作以及sql语句传参并不是很多，按照课程资料方法走，并没有增删改操作进行封装。完成项目后我想到这一点，但对此更改后几乎所有dao层都要更改，工程量较大，在有些函数中还需要进行数据库事务管理，保证其一致性。所以在此次项目中并没有对此更改。在以后的jdbc项目中如果增删改操作比较多，可以实现增删改操作封装。

